package task03;

import java.io.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CopyDir {
    /**
     * 拷贝文件夹，将target指定的地址代表的文件复制到destination指定的地址
     * @param target：被复制的文件地址
     * @param destination： 复制到的文件地址
     */
    public static void copy(String target, String destination) {
        // 准备被复制的文件
        File targetFile = new File(target);
        // 复制出来的的新文件
        File destFile = new File(destination);

        // 如果被复制文件不存在，直接return
        if (!targetFile.exists()) {
            System.out.println("目录不存在！");
            return;
        }

        // 生成新文件，准备将被复制的文件复制进去
        if (!destFile.exists()) {
            destFile.mkdirs();
            System.out.println(destFile + "  复制成功");
        }

        //创建一个线程池
        ExecutorService service = Executors.newFixedThreadPool(10);

        //对于被复制文件夹中的每个文件f
        for (File f : targetFile.listFiles()) {
            //在线程池中提交一个任务
            service.submit(() -> {
                // 如果是文件：调用fileCopy函数复制文件，
                if (f.isFile()) {
                    fileCopy(f.getAbsolutePath(), destFile.getAbsolutePath() + "/" + f.getName());
                // 如果是文件夹：递归调用自身
                } else {
                    copy(f.getAbsolutePath(), destFile.getAbsolutePath() + "/" + f.getName());
                }
            });

        }

        service.shutdown();

    }

    /**
     * 拷贝文件targetFile，生成destFile
     * @param targetFile 被拷贝的文件
     * @param destFile 拷贝生成的文件
     */
    private static void fileCopy(String targetFile,String destFile){
        BufferedInputStream bis=null;
        BufferedOutputStream bos=null;
        try {
            // 准备buffer用于读入拷贝的文件targetFile
            bis= new BufferedInputStream(new FileInputStream(targetFile));
            // 准备buffer用于写入拷贝生成的文件destFile
            bos=new BufferedOutputStream(new FileOutputStream(destFile));

            // 拷贝文件
            byte[] bArr = new byte[1024];
            int res = 0;
            while ((res = bis.read(bArr)) != -1){
                bos.write(bArr, 0, res);
            }
            System.out.println(destFile + "  复制成功");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (null!=bos){
                    bos.close();
                }
                if (null!=bis){
                    bis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }


}


